package com.groupbuying.common.baseutils.baseframework4plugins.basecrud.dao;//package com.mengtai.baseutils.baseframework4plugins.basecrud.dao;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.serializer.SerializerFeature;
//import BaseModel;
//import ModelHelper;
//import org.apache.commons.lang.StringUtils;
//
///**
// * @anthor zmlmagic
// * @date 2018/12/27 9:16 AM
// * @company 蒙泰互联网公司
// * @des 备注说明
// **/
//
//
//public class BaseESImpl<M extends BaseModel, QM extends BaseModel> implements BaseDAO<M, QM> {
//    protected String modulePathName = "";
//    protected ElasticsearchTemplate et;
//    protected final String INDEX_NAME;
//    protected final String TYPE_NAME;
//
//    protected void setModulePathName(String modulePathName) {
//        this.modulePathName = modulePathName;
//    }
//
//    public void setElasticsearchTemplate(ElasticsearchTemplate et) {
//        this.et = et;
//    }
//
//    public BaseESImpl(String INDEX_NAME, String TYPE_NAME) {
//        this.INDEX_NAME = INDEX_NAME;
//        this.TYPE_NAME = TYPE_NAME;
//    }
//
//    public M getModel() {
//        try {
//            return (M) ModelHelper.getModelClass(this.getClass(), this.modulePathName, 0).newInstance();
//        } catch (Throwable var2) {
//            return null;
//        }
//    }
//
//    public QM getQueryModel() {
//        try {
//            return (QM)ModelHelper.getQueryModelClass(this.getClass(), this.modulePathName, 1).newInstance();
//        } catch (Exception var2) {
//            return null;
//        }
//    }
//
//    public String create(M m) {
//        if (StringUtils.isEmpty(m.getUuid())) {
//            m.setUuid(BaseModel.genUuid());
//        }
//
//        String json = JSON.toJSONString(m, this.getJSONFilter(), new SerializerFeature[0]);
//        this.et.index((new IndexQueryBuilder()).withIndexName(this.INDEX_NAME).withType(this.TYPE_NAME).withId(m.getUuid()).withSource(json).build());
//        this.et.refresh(this.INDEX_NAME);
//        return m.getUuid();
//    }
//
//    public void batchCreate(List<M> list) {
//        this.batchExec(list);
//    }
//
//    public void batchUpdate(List<M> list) {
//        this.batchExec(list);
//    }
//
//    private void batchExec(List<M> list) {
//        List<IndexQuery> indexQueries = new ArrayList();
//        Iterator var4 = list.iterator();
//
//        while(var4.hasNext()) {
//            M m = (BaseModel)var4.next();
//            IndexQuery iq = (new IndexQueryBuilder()).withIndexName(this.INDEX_NAME).withType(this.TYPE_NAME).withId(m.getUuid()).withSource(JSON.toJSONString(m, this.getJSONFilter(), new SerializerFeature[0])).build();
//            indexQueries.add(iq);
//        }
//
//        this.et.bulkIndex(indexQueries);
//        this.et.refresh(this.INDEX_NAME);
//    }
//
//    public void batchCreateOrUpdate(List<M> list) {
//        this.batchExec(list);
//    }
//
//    public void update(M m) {
//        String json = JSON.toJSONString(m, this.getJSONFilter(), new SerializerFeature[0]);
//        IndexRequest indexRequest = new IndexRequest();
//        indexRequest.source(json);
//        UpdateQuery updateQuery = (new UpdateQueryBuilder()).withIndexName(this.INDEX_NAME).withType(this.TYPE_NAME).withId(m.getUuid()).withIndexRequest(indexRequest).withClass(ModelHelper.getModelClass(this.getClass(), this.modulePathName, 0)).build();
//        this.et.update(updateQuery);
//        this.et.refresh(this.INDEX_NAME);
//    }
//
//    public void updateCell(M m, String opeCellName) {
//        throw new RuntimeException("Method updateCell not supported.");
//    }
//
//    public void delete(M m) {
//        this.delete(m.getUuid());
//    }
//
//    public void delete(String uuid) {
//        DeleteQuery deleteQuery = new DeleteQuery();
//        deleteQuery.setQuery(QueryBuilders.termQuery("uuid", uuid));
//        deleteQuery.setIndex(this.INDEX_NAME);
//        deleteQuery.setType(this.TYPE_NAME);
//        this.et.delete(deleteQuery);
//        this.et.refresh(this.INDEX_NAME);
//    }
//
//    public void deletes(List<String> needDeleteUuids) {
//        DeleteQuery deleteQuery = new DeleteQuery();
//        deleteQuery.setQuery(QueryBuilders.termsQuery("uuid", needDeleteUuids));
//        deleteQuery.setIndex(this.INDEX_NAME);
//        deleteQuery.setType(this.TYPE_NAME);
//        this.et.delete(deleteQuery);
//        this.et.refresh(this.INDEX_NAME);
//    }
//
//    public M getByUuid(String uuid) {
//        try {
//            TermQueryBuilder termQuery = QueryBuilders.termQuery("uuid", uuid);
//            NativeSearchQueryBuilder searchBuilder = (new NativeSearchQueryBuilder()).withIndices(new String[]{this.INDEX_NAME}).withTypes(new String[]{this.TYPE_NAME});
//            searchBuilder.withPageable(new PageRequest(0, 1));
//            searchBuilder.withQuery(termQuery);
//            List<M> list = this.et.queryForList(searchBuilder.build(), ModelHelper.getModelClass(this.getClass(), this.modulePathName, 0));
//            return list.size() > 0 ? (BaseModel)list.get(0) : null;
//        } catch (Exception var5) {
//            var5.printStackTrace();
//            return null;
//        }
//    }
//
//    public List<M> getByUuids(List<String> uuids) {
//        List<M> retListAll = new ArrayList();
//        int len = (int)Math.ceil((double)uuids.size() / 1000.0D);
//
//        for(int i = 0; i < len; ++i) {
//            List<String> tempUuids = uuids.subList(i * 1000, (i + 1) * 1000 > uuids.size() ? uuids.size() : (i + 1) * 1000);
//            TermsQueryBuilder q = QueryBuilders.termsQuery("uuid", tempUuids);
//            SearchQuery searchQuery = (new NativeSearchQueryBuilder()).withIndices(new String[]{this.INDEX_NAME}).withTypes(new String[]{this.TYPE_NAME}).withQuery(q).withPageable(new PageRequest(0, 1000)).build();
//            List<M> list = new ArrayList();
//            list.addAll(this.et.queryForList(searchQuery, ModelHelper.getModelClass(this.getClass(), this.modulePathName, 0)));
//            retListAll.addAll(list);
//        }
//
//        return retListAll;
//    }
//
//    public void setDataDeleteFlag(String uuid, int delFlag) {
//        M m = this.getByUuid(uuid);
//        m.setDelFlag(delFlag);
//        this.update(m);
//    }
//
//    public List<M> getAll() {
//        SearchQuery searchQuery = (new NativeSearchQueryBuilder()).withIndices(new String[]{this.INDEX_NAME}).withTypes(new String[]{this.TYPE_NAME}).withPageable(new PageRequest(0, 1000)).build();
//        List<M> list = new ArrayList();
//        list.addAll(this.et.queryForList(searchQuery, ModelHelper.getModelClass(this.getClass(), this.modulePathName, 0)));
//        return list;
//    }
//
//    public Pager getAll(Pager pager) {
//        NativeSearchQueryBuilder searchBuilder = (new NativeSearchQueryBuilder()).withIndices(new String[]{this.INDEX_NAME}).withTypes(new String[]{this.TYPE_NAME});
//        pager.setTotalNum(this.getCount(this.getQueryModel()));
//        searchBuilder.withPageable(new PageRequest(pager.getNowPage() - 1, pager.getPageShow()));
//        SearchQuery searchQuery = searchBuilder.build();
//        List<M> list = new ArrayList();
//        list.addAll(this.et.queryForList(searchQuery, ModelHelper.getModelClass(this.getClass(), this.modulePathName, 0)));
//        pager.setResults(list);
//        return pager;
//    }
//
//    public List<M> getByCondition(QM qm) {
//        Pager pager = new Pager();
//        pager.setPageShow(800);
//        List<M> listAll = new ArrayList();
//        return this.getModelList(qm, pager, listAll);
//    }
//
//    private List<M> getModelList(QM qm, Pager pager, List<M> listAll) {
//        Pager pager1 = this.getByCondition(qm, pager);
//        List<M> list = pager1.getResults();
//        listAll.addAll(list);
//        if (listAll.size() < pager.getTotalNum()) {
//            pager1.setNowPage(pager1.getNowPage() + 1);
//            this.getModelList(qm, pager1, listAll);
//        }
//
//        return listAll;
//    }
//
//    public int getCount(QM qm) {
//        NativeSearchQueryBuilder searchBuilder = (new NativeSearchQueryBuilder()).withIndices(new String[]{this.INDEX_NAME}).withTypes(new String[]{this.TYPE_NAME});
//        BoolQueryBuilder query = QueryBuilders.boolQuery();
//        this.prepareCondition(qm, query);
//        searchBuilder.withQuery(query);
//        SearchQuery searchQuery = searchBuilder.build();
//        long count = this.et.count(searchQuery);
//        return (int)count;
//    }
//
//    public Pager getByCondition(QM qm, Pager pager) {
//        return this.getOnceByCondition(false, true, qm, pager);
//    }
//
//    public Pager getUuidsByCondition(QM qm, Pager pager) {
//        return this.getOnceByCondition(true, true, qm, pager);
//    }
//
//    public List<String> getUuidsByCondition(QM qm) {
//        Pager pager = new Pager();
//        pager.setPageShow(800);
//        List<String> listAll = new ArrayList();
//        return this.getUuidList(qm, pager, listAll);
//    }
//
//    private List<String> getUuidList(QM qm, Pager pager, List<String> listAll) {
//        Pager pager1 = this.getOnceByCondition(true, true, qm, pager);
//        List<String> list = pager1.getResults();
//        listAll.addAll(list);
//        if (listAll.size() < pager.getTotalNum()) {
//            pager1.setNowPage(pager1.getNowPage() + 1);
//            this.getUuidList(qm, pager1, listAll);
//        }
//
//        return listAll;
//    }
//
//    protected SimplePropertyPreFilter getJSONFilter() {
//        Class cls = this.getModel().getClass();
//        SimplePropertyPreFilter filter = new SimplePropertyPreFilter(cls, new String[0]);
//        filter = this.getJSONFilter(filter, cls);
//        return filter;
//    }
//
//    private SimplePropertyPreFilter getJSONFilter(SimplePropertyPreFilter filter, Class cls) {
//        if (cls.getName().equalsIgnoreCase(Object.class.getName())) {
//            return filter;
//        } else {
//            Field[] fs = cls.getDeclaredFields();
//            Field[] var7 = fs;
//            int var6 = fs.length;
//
//            for(int var5 = 0; var5 < var6; ++var5) {
//                Field f = var7[var5];
//                if (f.getAnnotation(Transient.class) != null && !f.getName().equalsIgnoreCase("txObject4ES")) {
//                    filter.getExcludes().add(f.getName());
//                }
//            }
//
//            cls = cls.getSuperclass();
//            return this.getJSONFilter(filter, cls);
//        }
//    }
//
//    private Pager getOnceByCondition(boolean onlyUuids, boolean needPage, QM qm, Pager pager) {
//        NativeSearchQueryBuilder searchBuilder = (new NativeSearchQueryBuilder()).withIndices(new String[]{this.INDEX_NAME}).withTypes(new String[]{this.TYPE_NAME});
//        BoolQueryBuilder query = QueryBuilders.boolQuery();
//        this.prepareCondition(qm, query);
//        searchBuilder.withQuery(query);
//        if (needPage) {
//            int count = this.getCount(qm);
//            pager.setTotalNum(count);
//            if (count == 0) {
//                return pager;
//            }
//
//            searchBuilder.withPageable(new PageRequest(pager.getNowPage() - 1, pager.getPageShow()));
//        } else {
//            searchBuilder.withPageable(new PageRequest(0, 1000));
//        }
//
//        SearchQuery searchQuery = searchBuilder.build();
//        if (!StringUtils.isEmpty(qm.getSortName())) {
//            if (qm.getSortName().contains(",")) {
//                String[] sortTypes = qm.getSortType().split(",");
//                String[] sortNames = qm.getSortName().split(",");
//
//                for(int i = 0; i < sortTypes.length; ++i) {
//                    searchQuery.addSort(new Sort(new Order[]{new Order("asc".equalsIgnoreCase(sortTypes[i]) ? Direction.ASC : Direction.DESC, sortNames[i])}));
//                }
//            } else {
//                searchQuery.addSort(new Sort(new Order[]{new Order("asc".equalsIgnoreCase(qm.getSortType()) ? Direction.ASC : Direction.DESC, qm.getSortName())}));
//            }
//        } else {
//            searchQuery.addSort(new Sort(new Order[]{new Order(Direction.DESC, "opeTime")}));
//        }
//
//        if (onlyUuids) {
//            searchQuery.addFields(new String[]{"uuid"});
//        }
//
//        List<M> list = new ArrayList();
//        list.addAll(this.et.queryForList(searchQuery, ModelHelper.getModelClass(this.getClass(), this.modulePathName, 0)));
//        if (onlyUuids) {
//            List<String> tempList = new ArrayList();
//            Iterator var11 = list.iterator();
//
//            while(var11.hasNext()) {
//                M tempM = (BaseModel)var11.next();
//                tempList.add(tempM.getUuid());
//            }
//
//            pager.setResults(tempList);
//        } else {
//            pager.setResults(list);
//        }
//
//        return pager;
//    }
//
//    protected void prepareCondition(QM qm, BoolQueryBuilder query) {
//        Map<String, Integer> map = qm.getMapCondition();
//        Iterator var5 = map.keySet().iterator();
//
//        while(var5.hasNext()) {
//            String key = (String)var5.next();
//            int opType = (Integer)map.get(key);
//            if (key.endsWith("2")) {
//                key = key.substring(0, key.length() - 1);
//            }
//
//            Object[] objs = this.checkFieldValue(key, qm, opType);
//            if ((Boolean)objs[0]) {
//                this.addOneCondition(key, opType, objs[1], query);
//            }
//        }
//
//    }
//
//    private Object[] checkFieldValue(String name, QM qm, int opType) {
//        Object[] rets = new Object[2];
//        Object[] objs = this.getFieldAndMethod(name, qm);
//        Field f = (Field)objs[0];
//        Object value = null;
//        if (opType == ConditionOpTypeEnum.LT.getCode()) {
//            value = this.getOneFiledValue(name + "2", qm);
//        } else {
//            value = this.getOneFiledValue(name, qm);
//        }
//
//        if (!f.getType().getName().contains("String")) {
//            if (!f.getType().getName().contains("int") && !f.getType().getName().contains("Integer") && !f.getType().getName().contains("long") && !f.getType().getName().contains("Long") && !f.getType().getName().contains("float") && !f.getType().getName().contains("Float") && !f.getType().getName().contains("double") && !f.getType().getName().contains("Double")) {
//                rets[0] = false;
//                return rets;
//            } else if (value != null) {
//                rets[0] = ((Number)value).doubleValue() > 0.0D;
//                rets[1] = value;
//                return rets;
//            } else {
//                rets[0] = false;
//                return rets;
//            }
//        } else {
//            rets[0] = value != null && ((String)value).trim().length() > 0;
//            rets[1] = value;
//            return rets;
//        }
//    }
//
//    private Object[] getFieldAndMethod(String name, QM qm) {
//        Field f = null;
//        Method mth = null;
//        Class cls = qm.getClass();
//
//        while(true) {
//            try {
//                f = cls.getDeclaredField(name);
//                mth = cls.getDeclaredMethod("get" + name.substring(0, 1).toUpperCase() + name.substring(1));
//            } catch (Exception var7) {
//                ;
//            }
//
//            if (f != null) {
//                return new Object[]{f, mth};
//            }
//
//            cls = cls.getSuperclass();
//        }
//    }
//
//    private Object getOneFiledValue(String name, QM qm) {
//        Object[] objs = this.getFieldAndMethod(name, qm);
//        Field f = (Field)objs[0];
//        Method mth = (Method)objs[1];
//        Object value = null;
//
//        try {
//            value = mth.invoke(qm);
//        } catch (Exception var8) {
//            ;
//        }
//
//        return value;
//    }
//
//    private void addOneCondition(String name, int opType, Object value, BoolQueryBuilder query) {
//        if (value != null && !StringUtils.isEmpty("" + value) && !("" + value).equalsIgnoreCase("null")) {
//            if (opType == ConditionOpTypeEnum.EQ.getCode()) {
//                query.must(QueryBuilders.termQuery(name, value));
//            } else if (opType == ConditionOpTypeEnum.Like.getCode()) {
//                Object value = value.toString().replaceAll(" ", ".*");
//                value = value.toString().replaceAll("\\(", ".*");
//                value = value.toString().replaceAll("\\)", ".*");
//                value = value.toString().replaceAll("\\（", ".*");
//                value = value.toString().replaceAll("\\）", ".*");
//                value = value.toString().replaceAll("\\*", ".*");
//                value = value.toString().replaceAll("-", ".*");
//                value = value.toString().replaceAll("_", ".*");
//                query.must(QueryBuilders.regexpQuery(name, ".*" + value + ".*"));
//            } else if (opType == ConditionOpTypeEnum.LeftLike.getCode()) {
//                query.must(QueryBuilders.regexpQuery(name, ".*" + value));
//            } else if (opType == ConditionOpTypeEnum.RightLike.getCode()) {
//                query.must(QueryBuilders.regexpQuery(name, value + ".*"));
//            } else if (opType == ConditionOpTypeEnum.GE.getCode()) {
//                query.must(QueryBuilders.rangeQuery(name).from(value));
//            } else if (opType == ConditionOpTypeEnum.GT.getCode()) {
//                try {
//                    query.must(QueryBuilders.rangeQuery(name).from(((Number)value).doubleValue() + 1.0D));
//                } catch (Exception var7) {
//                    query.must(QueryBuilders.rangeQuery(name).from(value));
//                }
//            } else if (opType == ConditionOpTypeEnum.LT.getCode()) {
//                try {
//                    query.must(QueryBuilders.rangeQuery(name).to(((Number)value).doubleValue() - 1.0D));
//                } catch (Exception var6) {
//                    query.must(QueryBuilders.rangeQuery(name).to(value));
//                }
//            } else if (opType == ConditionOpTypeEnum.IN.getCode()) {
//                query.must(QueryBuilders.termsQuery(name, this.array2List(value.toString())));
//            } else if (opType == ConditionOpTypeEnum.NotIN.getCode()) {
//                query.mustNot(QueryBuilders.termsQuery(name, this.array2List(value.toString())));
//            }
//
//        }
//    }
//
//    private List<String> array2List(String str) {
//        String[] ss = str.split(",");
//        return Arrays.asList(ss);
//    }
//}
//
